<?php

/**
 * DB 프로시저 관련 추상화 클래스 
 * 
 * @package php.db.proc
 */

/**
 * DB 프로시저 관련 추상화 클래스 
 * 
 * @package php.db.proc
 * 
 */
abstract class DBProc extends PObject { 
	
	protected $_name;
	protected $_option = array();
	protected $_bind = array();
	protected $_result;
	
	private $connector = null;
	
	public function __construct($connector, $name = '', $option = array()) { 
		$this->setConnector($connector);

		$this->name($name, $option);
	}
	
	/**
	 * 
	 * @return DBClient
	 */
	public function getConnector() { 
		return $this->connector;
	}
	
	public function setConnector(DBClient $connector) { 
		$this->connector = $connector;
	}
	
	public function getName() { 
		return $this->_name;
	}
	
	public function getOption($key = 'type') { 
		return $this->_option[$key];		
	}
	
	public function getBind($key, $subKey) { 
		return $this->_bind[strtolower($key)][$subKey];
	}
	
	public function getResult() { 
		return $this->_result;
	}
	
	/**
	 * 프로시저 이름설정 
	 * 
	 * @param string $str 구문 or 프로시저 이름
	 * @param string|array $option 바인딩을 생성할 옵션을 설정한다. type : 바인딩할 구문 타입, proc,sql,insert,update,delete 등으로 지원될 예정이다. 
	 */
	public function name($str, $option = 'proc')  {

		if (is_string($option)) { 
			$option = array('type' => $option);
		}

		$this->_name = $str;
		$this->_option = $option;
	}
	
	/**
	 * 바인딩 리스트 설정 
	 *
	 * @param string $name 바인딩 이름 
	 * @param string $type 바인딩될 타입, 데이타베이스 마다 틀림 
	 * @param string $output output 형태, in, out, inout, return 
	 * @param int $length 데이타길이, -1은 길이제한 없음
	 * @param mixed &$value 저장될 데이타 또는 output 변수에 저장될 데이타
	 * @param array $option 바인딩 될때 기타 옵션 
	 *                      update : bool, 업데이트 필드 
	 *                      op : 조건제어 , "and", "or"
	 */
	public function bind($name, $type = '', $output = 'in', $length = -1, &$value = null , $option = array()) {

		$this->_bind[strtolower($name)] = array(
			'name'		=> $name,
			'type'		=> strtolower($type),
			'output'	=> strtolower($output),
			'length'	=> $length,
			'value'		=> $value,
			'option'	=> $option,
		);
	}	
	
	/** 
	 * 파라미터 변수 설정 
	 * 
	 * @param string $name 바인딩 이름 
	 * @param mixed $value	바인딩 이름에 저장될 데이타 
	 */
	public function set($name, $value) {
		$this->_bind[strtolower($name)]['value'] = $value;	
	}

	/** 
	 * 파라미터 리스트 설정 
	 *
	 * @param array $arr 바인딩에 저장될 값을 설정 합니다.
	 */
	public function sets($arr) {
		foreach ($arr as $key => $value) { 
			$this->set($key, $value);
		}
	}	
	
	/**
	 * 프로시저 실행 
	 *
	 * 이 클래스를 상속하는 클래스는 spExecute 메소드를 통해서 저장프로시저의 실행을 지정할 수 있습니다.
	 * 
	 */
	public function execute()  {}

	/**
	 * 파라미터 변수 얻기 
	 * 
	 * @param string $name 파라미터 이름 
	 * @return mixed spBind에서 설정했던 $value 값을 가지고 옵니다. 
	 */
	public function get($name) {
		return $this->_bind[strtolower($name)]['value'];
	}	

	/**
	 * 파라미터 리스트 얻어오기 
	 * 
	 * @return array 바인딩 이름에 저장된 value 값을 배열로 리턴합니다.
	 */
	public function gets() {
		$temp = array();

		foreach ($this->_bind as $key => $arr) { 
			$temp[$key] = $arr['value'];
		}

		return $temp;
	}	
}
?>